数据长度扩展(LE Data Length Extension)功能允许LE控制器在连接状态下发送具有高达251字节的PDU。在连接期间的任何时刻,主从设备可以协商该PDU大小。
对比与BLE4.0/4.1的控制器数据通道最大有效载荷为27字节。使能数据扩展功能后的BLE4.2/BLE5.0能够达到251,数据速率提高了大约2.5倍。
一旦建立连接,控制器将以两种可能的方式之一进行操作:
提示本文所有的提及默认PDU/传输时间,均是指兼容BLE4.0/4.1的27Byte/328us,数据长度扩展(LE Data Length Extension)只被BLE4.2/5.0 支持。
如果在连接之前,PDU大小和传输时间都被设置为默认值(即TX和RX都为27B,328us),则CC2640R2F将不会发起数据长度交换命令(即LL_LENGTH_REQ
不发送)。
如果对等连接的主从设备发送LL_LENGTH_REQ
,此时对等设备同样以默认大小LL_LENGTH_RSP
回应.
如果在连接之前,PDU的大小和传输时间收发双方或者有一方不是默认值,则设备的LE控制器将使用LL_LENGTH_REQ
和LL_LENGTH_RSP
控制PDU协商一个PDU的较大的有效负载大小。
数据长度更新可由Host发起或Controller自主执行。主机或从机可以启动该过程。
数据长度更新过程完成后,两个控制器都会根据两个参数选择新的数据长度:PDU大小和传输时间。同时被主从设备支持的最大长度将会被选择; 考虑到时间来支持不同的数据速率。这些参数定义如下:
注意:有关数据长度更新过程的 更多信息,请参考蓝牙核心规范版本5.0的数据长度更新过程部分([Vol 6],B部分,第5.1.9节)。
下表可以参考支持的最大时间和大小。CC2640R2F支持这些最大值。
BLE4.2/5.0 工程中为了兼容BLE4.0/BLE4.1 所以默认的TX PDU设置为 27字节,同时同时使用328作为最大传输时间。
在RX PDU上面,默认使能LE Data Packet功能,也就是默认支持接收 251,以及RX PDU最大传传输时间为2120us。
为了最大吞吐量,诸如BLE主机的高层协议也应使用较大的PDU大小(请参见最大传输单元(MTU))。 下图显示出了协议栈中的各种PDU大小。
注意:正如数据长度更新过程章节介绍过,
应用工程可以通过以下两种方式更新数据长度:
1. 直接初始化到最大值,每次建立连接后Controller会自动申请一个更大PDU;
2. Controller 可以设置默认的PDU大小和传时间(27byte/328us ),然后再建立连接时动态协商该值;
以下HCI命令可用于与数据长度扩展功能相关的控制器交互:
HCI_LE_ReadSuggestedDefaultDataLenCmd()
)HCI_LE_WriteSuggestedDefaultDataLenCmd()
)HCI_LE_ReadMaxDataLenCmd()
)HCI_LE_SetDataLenCmd()
)以上命令可能会产生LE数据长度更改事件。
除了Bluetooth SIG定义的HCI命令之外,以下TI Vendor Specific命令还可以与数据长度扩展功能相关的控制器进行交互:
如初始值章节我们已经讲解过,为了兼容BLE4.0/4.1设备,默认传输的TX PDU设置为27字节/328us。然后Controller会在设备连接之初,共同协商一个的数值。禁止该功能可以将以下代码段放入应用工程的初始化话阶段(例如simple_peripheral_init)
#define APP_TX_PDU_SIZE 27
#define APP_RX_PDU_SIZE 27
#define APP_TX_TIME 328
#define APP_RX_TIME 328
//这个API记录在hci.h
HCI_EXT_SetMaxDataLenCmd (APP_TX_PDU_SIZE , APP_TX_TIME ,
APP_RX_PDU_SIZE , APP_RX_TIME )中。
一旦建立了连接,Controller对等的主从设备协商数据包大小。如果两个设备都设置为使用数据长度扩展,可以直接观察到吞吐量提高。
如果需要重新使能连接建立之初的自动协商功能,只需使用上述相同的命令调整值即可。使用代码段搜所示。
否则控制器将拒绝此调用。除了TI Vendor Specific命令外,还可以使用蓝牙SIG HCI命令,如下所示。
#define APP_SUGGESTED_PDU_SIZE 251
#define APP_SUGGESTED_TX_TIME 2120
//这个API记录在hci.h 中
HCI_LE_WriteSuggestedDefaultDataLenCmd (APP_SUGGESTED_PDU_SIZE ,
APP_SUGGESTED_TX_TIME )
HCI_LE_WriteSuggestedDefaultDataLenCmd()仅改变发送端的PDU大小和时间。
也可以使用以下API代码片段在连接中动态更改数据包长度。应用程序可以根据任何逻辑(如传感器数据或按钮按下)确定何时发生。
uint16_t cxnHandle; //Request max supported size
uint16_t requestedPDUSize = 251;
uint16_t requestedTxTime = 2120;
GAPRole_GetParameter(GAPROLE_CONNHANDLE, &cxnHandle); //This API is documented in hci.h
if (SUCCESS != HCI_LE_SetDataLenCmd(cxnHandle, requestedPDUSize, requestedTxTime))
DISPLAY_WRITE_STRING("Data length update failed", LCD_PAGE0);
文章所有代码、工具、文档开源。加入我们QQ群 591679055获取更多支持,共同研究CC2640R2F&BLE5.0。